iT邦幫忙

0

[LeetCode 筆記] 121. Best Time to Buy and Sell Stock

  • 分享至 

  • xImage
  •  

前言

  究竟何時才是買賣股票的最好時機呢? 這題邏輯很生活化,就是把一個陣列內所有的價格遍歷完,低買高賣後把最大的差價回傳出來,這題使用了單迴圈遍歷陣列裡所有的價格,遍歷裡也是常數的時間操作,時間複雜度推算可以達到 O(n),這篇有 Java 和 Python 的寫法。

題目

You are given an array prices where prices[i] is the price of a given stock on the ith day.

You want to maximize your profit by choosing a single day to buy one stock and choosing a different day in the future to sell that stock.

Return the maximum profit you can achieve from this transaction. If you cannot achieve any profit, return 0.

給你一個價格陣列 prices ,prices[i] 是取得一個股票在第 i 天的價格。

你想要最大化你的利潤,藉著選擇一天去買一張股票和選擇在未來不同天裡去賣掉那張股票。

你可以從這個交易回傳最大化的利潤。如果你無法達到任何利潤,就回傳 0。

題目連結:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/

題目限制

注意:不能在第二天買入後第一天賣出,必須先買後賣。

1 <= prices.length <= 105
0 <= prices[i] <= 104

範例

Input: prices = [7,1,5,3,6,4]
Output: 5
Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
Note that buying on day 2 and selling on day 1 is not allowed because you must buy before you sell.
Input: prices = [7,6,4,3,1]
Output: 0
Explanation: In this case, no transactions are done and the max profit = 0.

思路&筆記

  • 判斷陣列中值的大小,把更小的值存起來
  • 兩數的相差 = 把當前的索引的值 - 上一個索引的值
  • 比較前一個值,將比較大的值存入

JAVA 實現

class Solution {
    public int maxProfit(int[] prices) {
        
        int min = Integer.MAX_VALUE;  // 整數類型中的最大值 2³¹
        int op = 0;
        int pist = 0;
        
        for(int i = 0; i < prices.length; i++){
            
            // 找到陣列中最小的值
            if(prices[i] < min){
                min = prices[i]; // 前一個索引的值(最小的值)
            }
            
            // 兩數的相差 = 當前索引的值 - 前一個索引的值(最小的值)
            pist = prices[i] - min;
            
            // 比較前一個值,將比較大的值存入
            if(op < pist){  
                op = pist;
            }
        }
        return op;
    }
}

Python 實現

使用了和 Java 一樣的邏輯執行,換成 Python 的寫法。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:

        min = prices[0]; # 預設索引0
        op = 0;
        
        # 從索引1開始練遍歷
        for i in range(1,len(prices)):
            
            # 找出最小值
            if prices[i] < min :
                min = prices[i]
            
            # 把兩值的相差存入
            elif((prices[i] - min) > op): # 比較原本的 op
                op = prices[i] - min # 將比較大的值存入
        
        return op;

成績

Language Runtime Memory
Java 85 ms 42.7MB
Python 984 ms 25 MB

(新手上路,如有錯誤請友善告知,感謝)

Blog
https://chris81051.github.io/2023/04/18/LeetCode-121-Best-Time-to-Buy-and-Sell-Stock-Java-Python/
有分享技術文章、科技新聞、日常生活,歡迎一起討論


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言